package com.ray.auth.system.service;

import java.util.List;

import org.springframework.stereotype.Service;

import com.ray.auth.system.emun.LinkType;
import com.ray.auth.system.table.entity.Menu;
import com.ray.auth.system.table.entity.MenuRel;
import com.zjhc.flyhong.common.datastructure.TreeNode;
import com.zjhc.flyhong.common.function.operator.LoginUser;
import com.zjhc.flyhong.common.function.operator.PageDto;
import com.zjhc.flyhong.common.web.Result;

/**
 * <h1>菜单服务  服务接口</h1>
 * @创建人 ray
 * @创建时间 2017-06-10
 * @版本 1.0
 * @重要修改备注 
 * 
 */
@Service
public interface MenuService {
	/***
	 * @描述 <h1>添加菜单</h1><br/>数据库操作信息从  Operater对象中获取.
	 * @参数 entity 菜单对象
	 * @参数 operater 操作人信息
	 * @异常    内部捕获异常
	 * @事物    异常=>事物进行回滚
	 * @返回 result  返回结果  result.status => 0表示成功 ,其余表示失败
	 */
	public Result<Object> saveMenu(Menu entity, LoginUser loginUser);
    
	/**
	 * 获取用户资源下授权的 菜单  包括用户、用户组、角色
	 * @param userId 用户ID
	 * @return 菜单资源
	 */
	public List<Menu> queryUserMenus(String userId,String appid);
	/**
	 * 通过关联ID和关联类型 获取对应的菜单资源
	 * @param linkId 关联ID
	 * @param linkType 关联类型
	 * @return 菜单资源
	 */
	public List<Menu> queryMenusByLinkType(String linkId,String appId, LinkType linkType);
	/**
	 * 获取超级用户所有资源下授权的 菜单  包括用户、用户组、角色
	 * @param userId 用户ID
	 * @return 菜单资源
	 */
	public List<Menu> querySuperUserMenus(String appid);
    /**
     * 通过父节点获取 菜单资源
     * @param id 父节点
     * @param loginUser 登录用户
     * @return
     */
	public List<TreeNode> queryMenuListByParentId(String id, Integer level,LoginUser loginUser);
	/**
	 * 查询所有从菜单
	 * @param params 查询参数
	 * @param page 分页信息
	 * @param loginUser 登录用户
	 * @return
	 */
	public PageDto<Menu> queryMenuList(Menu params, PageDto<Menu> page, LoginUser loginUser);
    /**
     * 逻辑删除 菜单数据
     * @param id 菜单编号
     * @param loginUser 登录用户
     * @return
     */
	public Result<Object> deleteMenu(String id, LoginUser loginUser);
    /**
     * 通过ID查询菜单信息
     * @param id 菜单编号
     * @param loginUser 登录用户
     * @return
     */
	public Menu queryMenu(String id, LoginUser user);
    /**
     * 修改菜单信息
     * @param record 菜单对象
     * @param user 登录用户
     * @return
     */
	public Result<Object> updateMenu(Menu record, LoginUser user);
    /**
     * 通过父节点id获取父节点信息 提供符节点ID 0 返回虚拟节点
     * @param patentMenuId
     * @param user
     * @return
     */
	public Menu queryParentMenu(String patentMenuId, LoginUser user);
    /**
     * 获取桌面菜单
     * @param loginUser 登录用户
     * @return
     */
	public List<TreeNode> queryUserHomeMenu(String appid,LoginUser loginUser);
    /**
     * 更具类型查询
     * @param type
     * @param user
     * @return
     */
	public List<Menu> queryMenusByMenuType(String type, LoginUser user);
    /**
     * 查询拥有的资源
     * @param id
     * @param level
     * @param loginUser
     * @return
     */
	public List<TreeNode> queryMyMenuListByParentId(String id, Integer level, LoginUser loginUser);
    /**
     * 通过菜单找找下级菜单
     * @param menuId
     * @param user
     * @return
     */
	public List<Menu> queryChildMenuList(String menuId, LoginUser user);
	/**
     * 通过菜单找找下级菜单 包括禁用的
     * @param menuId
     * @param user
     * @return
     */
	public List<Menu> queryAllChildMenuList(String menuId, LoginUser user) ;
     /**
      * 获取用户拥有的菜单
      * @param userId
      * @param user
      * @return
      */
	public List<Menu> queryUserOnwerMenus(String userId, LoginUser user);
    /**
     * 获取角色拥有的菜单
     * @param roleId
     * @param user
     * @return
     */
	public List<Menu> queryRoleOnwerMenus(String roleId, LoginUser user);
    /**
     * 新增菜单关联
     * @param menuId
     * @param linkId
     * @param type
     * @param loginUser
     * @return
     */
	public Result<Object> addMenuRel(String menuId, String linkId, String type, LoginUser loginUser);
    /**
     * 判断菜单关联
     * @param menuId
     * @param roleId
     * @param type
     * @param loginUser
     * @return
     */
	public Result<Object> deleteMenuRel(String menuId, String linkId, String type, LoginUser loginUser);
	/**
     * 查询菜单关联
     * @param menuId
     * @param roleId
     * @param type
     * @param loginUser
     * @return
     */
	public MenuRel queryMenuRel(String menuId, String linkId, String type, LoginUser loginUser);
	/**
	 * 通过菜单ID获取APPID
	 * @param parentMenuId
	 * @return
	 */
	public String getAppId(String menuId);
}
